perm filename FNTFAI.FAI[VIS,HPM]6 blob sn#295860 filedate 1977-07-13 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	FNTFAI
C00003 00003	L3X2:	POP	P,RETAD			 L3X2(PIC,YLO,XLO,CHAR)
C00007 00004	L6X4:	POP	P,RETAD			 L6X4(PIC,YLO,XLO,CHAR)
C00011 00005	L1X1:	POP	P,RETAD			 L1X1(PIC,YLO,XLO,CHAR)
C00015 00006	L3Y4:	POP	P,RETAD			 L3Y4(PIC,YLO,XLO,CHAR)
C00019 00007		TITLE	FNTVEC
C00023 ENDMK
C⊗;
	TITLE	FNTFAI
	ENTRY	L3X2, L3Y4, L6X4, L1X1

PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14

T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ PICPNT←5 ↔ BITPNT←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ NFWD←12 ↔ RASW←13 ↔ YEX←14 ↔ PICPT2←CHAR←15
P←17
RETAD:	0
L3X2:	POP	P,RETAD			; L3X2(PIC,YLO,XLO,CHAR)
	POP	P,CHAR		;routine to assemble a 3 by 2 compressed character.
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
	JUMPL	XLO,@RETAD
	MOVE	RASW,(CHAR)
	LSH	RASW,-33		;fetch raster width from font def
	MOVEI	XHI,-1(RASW)		;use it with XLO to get XHI
	ADD	XHI,XLO
	HRRZ	YEX,1(CHAR)		;get DATA ROW COUNT from def
	MOVE	T,YLO
	ADDI	T,1(YEX)		;bounds check for Y
	ASH	T,-1
	SUB	T,PCLN(PIC)
	ASH	T,1
	CAILE	T,0
	SUB	YEX,T
        JUMPLE	YEX,@RETAD
	MOVEI	BITPNT,1(CHAR)		;construct byte pointer
	TLO	BITPNT,100		;for bit array
	
	IDIVI	XLO,3			;get position of starting bit
	IDIVI	XHI,3			;and finishing bit
        CAML	XHI,LNBY(PIC)
	JRST	@RETAD
	SUB	XHI,XLO			;calculate number of pic bytes-1
	JUMPG	XHI,GT1			;and if exactly one byte,
	SUB	XHR,XLR			;calculate how many bits in it-1
GT1:	ASH	XLR,1			;calculate jump offset for main loop
	SUBI	XHR,2			;and for trailing last byte
	MOVN	XHR,XHR
	ASH	XHR,1
	MOVE	TT,BPTAB(PIC)		;set up skeleton byte pointer
	ADD	TT,XLO			;for X
	MOVE	PICPT2,(TT)

	PUSH	P,12

	MOVNI	YEX,(YEX)		;loop counter for Y, neg count in left *****
	HRL	YLO,YEX			; <TWICE> line number in right
		
YLOOP:	MOVEI	TT,(YLO)		;finish up byte pointer by inserting
	ASH	TT,-1			;line address for current Y position
	ADDI	TT,LINTAB(PIC)
	MOVE	PICPNT,PICPT2
	ADD	PICPNT,(TT)

	LDB	TT,PICPNT		;pick up first affected picture byte
	JUMPE	XHI,RTL(XHR)		;if only one altogether, skip loop
	MOVE	NFWD,XHI		;if more than one, do first fractional
	JRST	STL(XLR)		;one

FWL:	ILDB	TT,PICPNT		;and then do all the others but the last
STL:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;check for byte overflow
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it
	SOJG	NFWD,FWL

	ILDB	TT,PICPNT		;the last affected byte
      	JRST	RTL(XHR)		;see how much of it to do
RTL:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;bounds check
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it

	MOVE	T,BITPNT		;check if time to skip BP
	LSH	T,-36			;in font definition
	CAMGE	T,RASW			;to next line
	AND	BITPNT,[7777777777]

	AOBJN	YLO,YLOOP		;check if all lines done
	POP	P,12
	JRST	@RETAD
L6X4:	POP	P,RETAD			; L6X4(PIC,YLO,XLO,CHAR)
	POP	P,CHAR
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
	JUMPL	XLO,@RETAD
	MOVE	RASW,(CHAR)
	LSH	RASW,-33		;fetch raster width from font def
	MOVEI	XHI,-1(RASW)		;use it with XLO to get XHI
	ADD	XHI,XLO
	HRRZ	YEX,1(CHAR)		;get DATA ROW COUNT from def
	MOVE	T,YLO
	ADDI	T,1(YEX)		;bounds check for Y
	ASH	T,-2
	SUB	T,PCLN(PIC)
	ASH	T,2
	CAILE	T,0
	SUB	YEX,T
        JUMPLE	YEX,@RETAD
	MOVEI	BITPNT,1(CHAR)		;construct byte pointer
	TLO	BITPNT,100		;for bit array
	
	IDIVI	XLO,6			;get position of starting bit
	IDIVI	XHI,6			;and finishing bit
        CAML	XHI,LNBY(PIC)
	JRST	@RETAD
	SUB	XHI,XLO			;calculate number of pic bytes-1
	JUMPG	XHI,GT3			;and if exactly one byte,
	SUB	XHR,XLR			;calculate how many bits in it-1
GT3:	ASH	XLR,1			;calculate jump offset for main loop
 	SUBI	XHR,5			;and for trailing last byte
	MOVN	XHR,XHR
	ASH	XHR,1
	MOVE	TT,BPTAB(PIC)		;set up skeleton byte pointer
	ADD	TT,XLO			;for X
	MOVE	PICPT2,(TT)

	PUSH	P,12

	MOVNI	YEX,(YEX)		; loop counter for Y, neg count in left
	HRL	YLO,YEX			; <TWICE> line number in right
		
YLOOP3:	MOVEI	TT,(YLO)		;finish up byte pointer by inserting
	ASH	TT,-2			;line address for current Y position
	ADDI	TT,LINTAB(PIC)
	MOVE	PICPNT,PICPT2
	ADD	PICPNT,(TT)

	LDB	TT,PICPNT		;pick up first affected picture byte
	JUMPE	XHI,RTL3(XHR)		;if only one altogether, skip loop
	MOVE	NFWD,XHI		;if more than one, do first fractional
	JRST	STL3(XLR)		;one

FWL3:	ILDB	TT,PICPNT		;and then do all the others but the last
STL3:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;check for byte overflow
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it
	SOJG	NFWD,FWL3

	ILDB	TT,PICPNT		;the last affected byte
      	JRST	RTL3(XHR)		;see how much of it to do
RTL3:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;bounds check
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it

	MOVE	T,BITPNT		;check if time to skip BP
	LSH	T,-36			;in font definition
	CAMGE	T,RASW			;to next line
	AND	BITPNT,[7777777777]

	AOBJN	YLO,YLOOP3		;check if all lines done
	POP	P,12
	JRST	@RETAD
L1X1:	POP	P,RETAD			; L1X1(PIC,YLO,XLO,CHAR)
	POP	P,CHAR		;routine to assemble an uncompressed character.
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
	JUMPL	XLO,@RETAD
	MOVE	RASW,(CHAR)
	LSH	RASW,-33		;fetch raster width from font def
	MOVEI	XHI,-1(RASW)		;use it with XLO to get XHI
	ADD	XHI,XLO
	HRRZ	YEX,1(CHAR)		;get DATA ROW COUNT from def
	MOVE	T,YLO
	ADDI	T,1(YEX)		;bounds check for Y
	SUB	T,PCLN(PIC)
	CAILE	T,0
	SUB	YEXT
        JUMPLE	YEX,@RETAD
	MOVEI	BITPNT,1(CHAR)		;construct byte pointer
	TLO	BITPNT,100		;for bit array
	
        CAML	XHI,LNBY(PIC)
	JRST	@RETAD
	SUB	XHI,XLO			;calculate number of pic bytes-1
GPλht%≠↔-
%)(I¬A)β∧QA∪εR∩$wgKh↓k`Ag-KYKi=\AEsQJAa←%]iKd4∀∪β	⊂∪)(Ya→≡∩∩$wM←d↓0~∀∪5∨-
∪A∪π!(HXQ)($~∀~∀%≠∨-≥$∪300Q30$∩∩wY=←`AG=k]iKHAM←d↓2XA]∃NAG←U]hAS8AYKMP~∀∪⊃I_∪3→<Y30$∩∩wY%]JA]U[EKd↓S\Ae%OQh~(∩∩~∃e→∨∨ Pt∪≠∨Y∩∪)PXQ3→<R∩∩w→S]Sg Ak`A	siJAA←S]i∃dAM←HAaSGQkeJ~(∪β		$∪)(Y1∪≥)βλQ!∪ε$∩∩wEdAS]g∃eiS]≤AYS]∀ACIIIKgf~(∪≠∨-∀∪!∪πA≥(Y!%π!(d4∀∪β	⊂∪!∪πA≥(XQQ(R~∀4∀∪→	λ∪)(YA∪π!≥P∩∩wa%GVAk@AMSeMhACM→KGiK⊂AaSGQkeJA	siJ~(∪'↔∪Aα∪1⊃HY1⊃∩$∩@@@@@@@mC]HA≥↑AS]Q↑AY←=`~∃
]_ht∪%→	∧∪Q(Y!∪
!≥(∩$wI↑A¬YXAi!JAESQf~∃'Q_ht∪%→	∧∪PY¬∪)A≥(~∀%∨$∪)PY(~∀%	!∧∪Q(Y!∪
!≥(∩$weKiUe\ASP~∀∪'=∃∂
∪a⊃$Y
]_h~∀4∀∪≠∨Y
∪(Y	∪)!≥P∩∩wG!KGVA%LAiS5JAi↑↓gWS`↓¬ ~∀%→'⊂∪PXZfl$∩∩wS8AM←]PAIKM%]SiS=\~∀∪
β≠∂
%(Y%βM.∩∩∩mi↑A]∃qhAY%]J~∀%β≥λ∪	∪)!≥PY6nn\nnnn\no:~(~∀∪β=¬∃≤∪e→≡Y31∨∨ h$∩wGQ∃GVAS_ACYX↓YS]KLAI←]∀~∀∪∃I'(∪↓I)βλ4∀→_g2Pt∪!∨@∪ Y%∃)βλ∩$∩vA_M2hQ!%εY3→<Y1→≡1π⊃β$$~∀∪!= ∪ Y
⊃β$∩$∩wM←HAgSI∃oCsf↓MkYX↓aCOKL~∀∪!= ∪ Ya→≡~∀%!∨ ∪@Y3→≡4∀∪!∨@∪ Y!%ε~∀∪)+≠!_%1→≡Y↓%)β⊂~∀∪≠=-
∪%¬'.XQ
⊃β$R4∀∪→' ∪%β'\XZff$∩wMKQGPAe¬giKd↓oSIi AMe←4AM←]PAIKL4∀∪≠∨Y∩∪1!∩XZb!%β'.$∩∩wkMJASh↓oSiP↓1→≡AQ↑AOKPA1⊃∩4∀∪β	⊂∪1⊃∩11→≡~(∪⊃%%h∪300bQπ⊃¬$R∩∩mOKhA⊃β)αAI∨.Aπ=+≥(A→e←ZA⊃KL~∀%≠∨-
%(Y3→<~∀∪β⊃	∩∪(0bQ3`R∩∩w	←k]ILAGQK
VAM←HA2~∀%β'⊂∪PXZd~(∪'+∧%(Y→≥	2Q!∪R~∀∪¬'⊂∪(0d~∀∪
β∪→
%(X`~(∪'+∧%30YP~∀@@@@@@↓∃+≠!∀∪30αbαJ⊗αH∀ h!→T⎇Q2"($j('∃⊗_T!R i∀DB]qww≤z9:q]⊂1<`4e poinper
	TLO	BITPNT,100		;for bit array
	
∪∪⊃∪-∩∪a→≡Xf$∩∩wO∃hAa←MSiS←8A←LAMiCei%]NAE%h~∀∪%	∪-∩%1⊃∩XL∩∩∩w¬]HAM%]SgQ%]NAE%h~∧@@@@@Aπβ≠0∪1⊃∩1!π→≤!!∪εR4∀∪∃%M(∪↓%∃)βλ~(∪'+∧%1⊃∩Ya→≡∩∩$wGCY
kYCi∀AUk[	KdA←α1βC'~βgS/→5DQ!∀U,ZλpMD	∃D=B"!↔x;Y∧
9H⊂∩↑0qz6≡P7w2H1<z2KεA∧iUa∧l$∀⊗,&)αDD]qXv1z`,ate how many bits in it-D~∃∂(β⊃`⊂L~9MDJ!CλHα".l<;_⎇-L=→(
.αvx⊂≠q39`%t fo↓HASCS8AY←←@~∀∪'U
$&DBI1HHH%oπv!β≠} λ∞NX: ⊗~w3P&_yz⊂1≡z2FEαfgk'αl$ ∩XHR
	ASH	XHR,1
∪≠=(
⊗$M"Q2I→e$%
∧L~⊃⊃∪@>y=⊂≥x⊂9eYv2z7[⊂1<@4e po@%]`∪↔⊂h(&ε$ &@%EJ∧De
∧L~⊃Q M≥X)⊂M∃%⊃∪j!⊃".yM}H⊗β!!33uHQ4∩0j
K

J
#"APB4∃*9α4ε⊗@εEεB∧fgk∪$DlbV⊗⊂,bV∀DD@; loop counter @→←dA20A]KNαβ∂?Ww!β'9∧¬F.]β"A→∀Sα+→⊂πV,Ql∧DDNβ <TWICE>li`≥J↓]kKE∃dAS\↓`'∨G 4λ$Hh*f2|zAIHLj>@4Y⊃∃%"β
⊗)Ih""'<β4w4\t⊂:xλ1<z2H87tw≥2y⊂!≡P4w9Yy:4w→FE∧`Td∧j*⊗Y∧DB]v4w→P0r2≤2yyP→4πr @
keeK9hA2AA←gSi%←\
∀%β	λ∪Q(Y¬!Qβ∧Q!%εR4PJ6 =hQ∃∧L:	e"e	_5¬#!Q LHA∃∧L8	e"b
JBHh!Q LdH!∃%"J	∀≥∧jA⊂K←
≤6@4≥<λm<\p~λ0s3"Xz2r picture byte¬
	JUMPE	XHI,RTL2(XHR)		;if only one altogether skip loop
	MOVE	NFWD,XHI		;if more than one, do firsT fractional
	JRST	STL2(XLR)		;one

FWL2:	SUB	PICPNT,LNWD(PIC)
	LDB	TT,PICPNT		;and then do all the others but the last
STL2:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;check for byte overflow
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it
	SOJG	NFWD,FWL2

	SUB	PICPNT,LNWD(PIC)
	LDB	TT,PICPNT		;the last affected byte
	JRST	RTL2(XHR)		;see how much of it to do
RTL2:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;bounds check
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it

	MOVE	T,BITPNT		;check if time to skip BP
	LSH	T,-36			;in font definition
	CAMGE	T,RASW			;to next line
	AND	BITPNT,[7777777777]

	AOBJN	YLO,YLOOP2		;check if all lines done
	POP	P,12
	JRST	@RETAD

        PRGEND
	TITLE	FNTVEC
	ENTRY	V3X2

PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14

T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ XD←5 ↔ XDR←XWID←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ YD←12 ↔ NFWD←13 ↔ YEX←14 ↔ PICPNT←15
P←17
RETAD:	0
V3X2:	POP	P,RETAD			; V3X2(PIC,YLO,XLO,XWID,XD,YD)
	POP	P,YD	    ;routine to make a vector xd wide, yd long slope xwid
	POP	P,XD
	POP	P,XWID
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
	MOVE	XHI,XLO
	ADD	XHI,-1(XWID)
	IDIVI	XLO,3
	IDIVI	XHI,3
	IDIVI	XD,3

YLP:	HRRZ	TT,YLO
	ASH	TT,-1
	ADDI	TT,LINTAB(PIC)
	MOVE	PICPNT,(TT)
	MOVEI	TT,-1(XLO)
	ADD	TT,BPTAB(TT)
	ADD	PICPNT,(TT)

	MOVE	NFWD,XHI
	SUBI	NFWD,1(XLO)
	MOVE	TT,XHR
	JUMPGE  NFWD,FRB
	SUB	TT,XLR
	JRST	LSB

FRB:	ILDB	T,PICPNT		;for first fractional byte
	ADD	T,(XLR)[3
			2
			1]
	CAMLE	T,BMAX(PIC)
	MOVE	T,BMAX(PIC)
	DPB	T,PICPNT

	JUMPE	NFWD,LSB
FLP:	ILDB	T,PICPNT		;for middle full bytes
	ADDI	T,3
	CAMLE	T,BMAX(PIC)
	MOVE	T,BMAX(PIC)
	DPB	T,PICPNT
	SOJG	NFWD,FLP

LSB:	ILDB	T,PICPNT		;for last fractional byte
	ADDI	T,1(TT)
	CAMLE	T,BMAX(DD	XLO,XD
	CAIL	XLR,3
	DSUB	XLO,[-1
		     3]
	DADD	XHI,XD
	CAIL	XHR,3
	DSUB	XHI,[-1
		     3]

	AOBJN	YLO,YLP

	END